package com.own.business.resource.business.util;

import com.own.business.resource.core.ResolveObjectStoreUtil;
import com.own.component.common.util.encrypt.EncryptUtil;
import com.own.component.store.core.Store;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.time.Duration;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

/**
 * ResourceTemporaryAccessUtil
 *
 * @author chenxueli
 * @date 2024-05-10 09:13:43
 */
@Slf4j
@Component
public class ResourceTemporaryAccessUtil {

    @Resource
    private Store<String> store;

    /**
     * 获取临时访问路径
     *
     * @param method     上传方式
     * @param path       文件路径 (https开头或者不是)
     * @param expiration 有效时间（秒）
     * @param style      样式
     * @return 临时访问路径
     */
    public String getTemporaryAccessPath(String method, String path, long expiration, String style) {
        var position = FileRecordUtil.getPosition(path);
        var property = ResolveObjectStoreUtil.getSourcePropertyByPosition(position);
        if (property != null && !property.getPrivateRead()) {
            return path;
        }
        // 判断是否已经在缓存中了
        var key = "tap:" + EncryptUtil.MD5.encrypt(path + style);
        if (store.value().contains(key)) {
            return store.value().get(key);
        }
        var resultMethod = ResolveObjectStoreUtil.getMethodByPosition(position);
        if (StringUtils.isBlank(resultMethod)) {
            resultMethod = method;
        }
        // 获取资源的path信息
        var resultPath = FileRecordUtil.getPath(path);
        var p = ResolveObjectStoreUtil.get(resultMethod).temporaryAccessPath(resultPath, expiration, style);
        store.value().set(key, p, Duration.ofSeconds(3300));
        return p;
    }

    /**
     * 获取临时访问路径
     *
     * @param method 上传方式
     * @param path   文件路径 (https开头或者不是)
     * @param style  样式
     * @return 临时访问路径
     */
    public String getTemporaryAccessPath(String method, String path, String style) {
        return getTemporaryAccessPath(method, path, 3600, style);
    }

    /**
     * 获取临时访问路径
     *
     * @param method     上传方式
     * @param pathList   文件路径 (https开头或者不是)
     * @param expiration 有效时间（秒）
     * @param style      样式
     * @return 临时访问路径
     */
    public Map<String, String> getTemporaryAccessPathMap(String method, Collection<String> pathList, long expiration, String style) {
        var map = new HashMap<String, String>();
        pathList.parallelStream().forEach(item -> {
            map.put(item, getTemporaryAccessPath(method, item, expiration, style));
        });
        return map;
    }

    /**
     * 获取临时访问路径
     *
     * @param method   上传方式
     * @param pathList 文件路径 (https开头或者不是)
     * @param style    样式
     * @return 临时访问路径
     */
    public Map<String, String> getTemporaryAccessPathMap(String method, Collection<String> pathList, String style) {
        return getTemporaryAccessPathMap(method, pathList, 3600, style);
    }

    /**
     * 获取临时访问路径
     *
     * @param method     上传方式
     * @param path       文件路径 (https开头或者不是)
     * @param expiration 有效时间（秒）
     * @return 临时访问路径
     */
    public String getTemporaryAccessPath(String method, String path, long expiration) {
        return getTemporaryAccessPath(method, path, expiration, null);
    }

    /**
     * 获取临时访问路径
     *
     * @param method 上传方式
     * @param path   文件路径 (https开头或者不是)
     * @return 临时访问路径
     */
    public String getTemporaryAccessPath(String method, String path) {
        return getTemporaryAccessPath(method, path, null);
    }

    /**
     * 获取临时访问路径
     *
     * @param method     上传方式
     * @param pathList   文件路径 (https开头或者不是)
     * @param expiration 有效时间（秒）
     * @return 临时访问路径
     */
    public Map<String, String> getTemporaryAccessPathMap(String method, Collection<String> pathList, long expiration) {
        return getTemporaryAccessPathMap(method, pathList, expiration, null);
    }

    /**
     * 获取临时访问路径
     *
     * @param method   上传方式
     * @param pathList 文件路径 (https开头或者不是)
     * @return 临时访问路径
     */
    public Map<String, String> getTemporaryAccessPathMap(String method, Collection<String> pathList) {
        return getTemporaryAccessPathMap(method, pathList, null);
    }

}
